/*
 * TacticaLMD.java
 *
 * Created on 21 de marzo de 2007, 23:23
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.LMDTEAM;


import futbol.tacticas.*;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.util.Vector;
import java.awt.*;
import futbol.General;

/**
 *
 * @author Administrador
 */
public class TacticaLMD implements Tactica{
    
     private int nValores[][]={
        {-160,0,7}, //0
        {-140,-85,6}, // def 1
        {-130,-20,6},  // def 2
        {-130,20,5}, // def 3       
        {-140,85,6},  // def 4
        {-30,60,6}, // cen 5
        {-30,0,6},// cen 6
        {-30,-60,6}, // cen7
        {100,-80,6}, // den 8
        {120,0,6},  // den 9
        {100,80,6}  // den 10 X,Y Fuerza<10
    };
    
    /** Creates a new instance of TacticaLMD */
    public TacticaLMD() {
    }

    public String getNombre() {
        return "LMD Team";
    }

    public Color getColor1() {
        return Color.ORANGE;
    }

    public Color getColor2() {
        return Color.WHITE;
    }

    public Color getColorNumero() {
        return Color.black;
    }

    public int getFuerza(int n) {
          return nValores[n][2];
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }
    
    

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        
            Vector<Comando> comandos=new Vector();
            
            int ContrariosMarcados[];
            
            Point jug[]=sj.getMisJugadores();
            Point ene[]=sj.getContrario();
            
             int bx = sj.getBola().x;
             int by = sj.getBola().y;
            
             int nJug=sj.getMasCercanoDeBola(); 
             
             
             // Portero
             int y=(int)(by/2);
             if (y<-20) y=-20;
             if (y>20) y=+20;
             if (nJug == 0)
              comandos.add(new ComandoIrA(0, bx , by));     
             else comandos.add(new ComandoIrA(0,nValores[0][0], y)); 
            
             ContrariosMarcados = new int[11];
            
            int nContrario;
            int nContrarioX;
            int nContrarioY;
           
             
            // posicin para marcar a contrarios
            for (int n=1;n<11;n++)
            {        
              int OffSet=0;    
                if (nJug == n)
                {
                    comandos.add(new ComandoIrA(n, bx , by));  
                    if (jug[n].x == bx && jug[n].y == by)
                        comandos.add(new ComandoIrA(n, 160 , 0));  
                    continue;
                }
                nContrario = sj.getContrarioMasCerca(nValores[n][0], nValores[n][1]);
                                                                
                if (Libre(nContrario,ContrariosMarcados))
                    {                   
                    if (bx>110)OffSet = +30;
                            
                    nContrarioX = ene[nContrario].x;
                    nContrarioY = ene[nContrario].y;                    
                    if (bx>nContrarioX)nContrarioX+= 15 + OffSet;
                    else nContrarioX-= 15 - OffSet;
                        
                    if (by>nContrarioY)nContrarioY+= 15 + OffSet;
                    else nContrarioY-= 15 - OffSet; 
                                                                   
                    if (n<5 && ene[nContrario].x>-50)// es defensa                                                    
                            comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1]));
                     else comandos.add(new ComandoIrA(n, nContrarioX, nContrarioY));                
                    }
                //else if(bx>0)comandos.add(new ComandoIrA(n, bx+5, nValores[n][1]));                
                else
                {
                    comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1]));
                }                
            }
            
            
                    
            // Al Ataque!!!!
            if (bx>120)   
            {
                    for (int n=1;n<11;n++)
                        if (jug[n].x>100)
                        {
                            comandos.add(new ComandoIrA(n,bx,by));                        
                            fTirarAPuerta(sj,n,ene, comandos);    
                        }                                                          
            }
            else PasarOLanzar(sj,nJug,jug,ene,comandos);             
          
            
            return comandos;
        
                  
             
    }
    

        //Quedarme con el balon o marcar
        public void PasarOLanzar(SituacionJugadores sj,int Jugador,Point jug[],Point ene[],Vector<Comando> comandos)         
        {
            
            Point bola=sj.getBola();
                            
            if (General.getDistancia(bola.getX(), bola.getY(), jug[Jugador].getX(), jug[Jugador].getY())<10 && jug[Jugador].getX()<50)   
            {
               int nJC= sj.getContrarioMasCerca(jug[Jugador].getX()+10,  bola.getY());
               double DisEne = General.getDistancia(jug[Jugador].getX(),  jug[Jugador].getY(), ene[nJC].getX(), ene[nJC].getY());
               if (jug[Jugador].getX()< nValores[Jugador][0] && DisEne>40)
               {
                   int Adonde;
                   if (bola.getY()>0)Adonde = ene[nJC].y-30;
                   else Adonde = ene[nJC].y + 30;
                   //comandos.add(new ComandoIrA(Jugador,jug[Jugador].getX()+5, Adonde)); 
                   if (DisEne>20)DisEne-=20;
                   else DisEne = 15;
                   comandos.add(new ComandoGolpearBola(Jugador, jug[Jugador].getX()+ 15,  jug[Jugador].getY())); 
                   comandos.add(new ComandoIrA(Jugador,bola.getX(), bola.getY()));                                           
               }  
               else  fTirarAPuerta(sj,Jugador,ene, comandos);   
            }
            else  fTirarAPuerta(sj,Jugador,ene, comandos);               
           
        }
   
        // Tiro a puerta mejorado
        public void fTirarAPuerta(SituacionJugadores sj,int Jugador,Point ene[],Vector<Comando> comandos)
        {
             int Portero = sj.getContrarioMasCerca(160,0);
             int y = ene[Portero].y;
             if (y>-20 && y<20)
             { 
                if (y>-5 && y<5)
                {
                    if (y>0)y=-20;
                    else y=20;
                    comandos.add(new ComandoTiroAPuerta(Jugador,-y));        
                }
                else comandos.add(new ComandoTiroAPuerta(Jugador,-y));        
             }
             else 
             {
                if (y>0)y=-20;
                    else y=20;         
                 comandos.add(new ComandoTiroAPuerta(Jugador,0));
             }        
        }
        
        public boolean Libre(int nContrario, int ContrariosMarcados[])
        {
               
        
        if (ContrariosMarcados[nContrario] == 0)        
        {                
           ContrariosMarcados[nContrario] =10;  
           return true;          
         }    
        else return false;
        }         
    
}